package br.com.dallas.vendas.controller;

import java.sql.Connection;
import java.sql.Date;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;

import javax.faces.model.SelectItem;

import org.primefaces.model.chart.PieChartModel;

import br.com.dallas.transportador.javabean.TransportadorBean;
import br.com.dallas.util.controller.AbstractController;
import br.com.dallas.util.converter.Conversor;
import br.com.dallas.util.exception.ClasseNaoEncontradaException;
import br.com.dallas.util.exception.ConexaoException;
import br.com.dallas.util.exception.ConsultarObjetoException;
import br.com.dallas.util.exception.InserirObjetoException;
import br.com.dallas.util.exception.ListaVaziaException;
import br.com.dallas.util.exception.ListarObjetoException;
import br.com.dallas.vendas.javabean.VendaBean;
import br.com.dallas.vendas.model.VendaModel;

public class VendaController extends AbstractController
{
	public VendaController() throws ConexaoException, ClasseNaoEncontradaException
	{
		super();
	}
	
	public VendaController(Connection conexao) throws ConexaoException
	{
		super(conexao);
	}

	public void carregarListaVolumesPorTransportadoras(final List<VendaBean> listaVolumesPorTransportadora, final VendaBean vendaBean) throws ListarObjetoException, ListaVaziaException
	{
		VendaModel vendaModel = null;
		try
		{
			if (vendaBean != null)
			{	
				vendaModel = new VendaModel(getConexao());
				
				if (listaVolumesPorTransportadora != null && !listaVolumesPorTransportadora.isEmpty())
					listaVolumesPorTransportadora.clear();
				
				listaVolumesPorTransportadora.addAll(vendaModel.getListaClientesPorTransportadoras(vendaBean));
				
				carregarListaClientesPorTransportadora(listaVolumesPorTransportadora, vendaBean);
			}
		}
		catch(ListarObjetoException e)
		{
			throw e;
		}
		finally
		{
			if (vendaModel != null)
				vendaModel = null;
		}
	}
	
	@SuppressWarnings("rawtypes")
	public void carregarGrafico(final List<VendaBean> lista, final PieChartModel pieChartModel, final SelectItem[] selecaoTransportador)
	{	
		Iterator it = lista.iterator();
		int i = 1;
		
		selecaoTransportador[0] = new SelectItem("", "Todos");
		
		while(it.hasNext())
		{
			VendaBean vendaIterando = (VendaBean) it.next();
			pieChartModel.set(vendaIterando.getTransportadorBean().getRazao() + " Tot.: " + vendaIterando.getQuantidadeVolume(), vendaIterando.getQuantidadeVolume());
			selecaoTransportador[i] = new SelectItem(vendaIterando.getTransportadorBean().getRazao(), vendaIterando.getTransportadorBean().getRazao());
			i++;
		}
	}
	
	@SuppressWarnings("rawtypes")
	private void carregarListaClientesPorTransportadora(final List<VendaBean> listaVolumesPorTransportadora, final VendaBean vendaBean)
	{	
		List<VendaBean> novaLista = null;
		HashSet<TransportadorBean> listaTransportadoras = null;
		VendaBean vendaBeanIterator = null;
		TransportadorBean transportadorBean = null;
		Iterator it = null;
		int quantidadeTotalVolume = 0;
		double valorTotalFrete = 0;
		int quantidadeTotalVolumeGeral = 0;
		double valorTotalFreteGeral = 0;
		try
		{
			if (listaVolumesPorTransportadora != null && !listaVolumesPorTransportadora.isEmpty())
			{	
				it = listaVolumesPorTransportadora.iterator();
				
				listaTransportadoras = new LinkedHashSet<TransportadorBean>();
				
				while(it.hasNext())
				{
					transportadorBean = ((VendaBean)it.next()).getTransportadorBean();
					listaTransportadoras.add(transportadorBean);
				}
				
				it = listaTransportadoras.iterator();
				
				novaLista = new ArrayList<VendaBean>();
				
				while(it.hasNext())
				{
					transportadorBean = (TransportadorBean) it.next();
					
					vendaBeanIterator = new VendaBean();
					
					for (int i = 0; i < listaVolumesPorTransportadora.size(); i++)
					{
						if (transportadorBean.getId() == ((VendaBean)listaVolumesPorTransportadora.get(i)).getTransportadorBean().getId())
						{
							vendaBeanIterator.getListaClientePorTrasnportadora().add(listaVolumesPorTransportadora.get(i));
							quantidadeTotalVolume += ((VendaBean)listaVolumesPorTransportadora.get(i)).getQuantidadeVolume();
							valorTotalFrete += ((VendaBean)listaVolumesPorTransportadora.get(i)).getValorFrete();
						}
					}
					quantidadeTotalVolumeGeral += quantidadeTotalVolume;
					valorTotalFreteGeral += valorTotalFrete;
					vendaBeanIterator.setTransportadorBean(transportadorBean);
					vendaBeanIterator.setQuantidadeVolume(quantidadeTotalVolume);
					vendaBeanIterator.setValorFrete(Double.parseDouble(Conversor.converteDoubleParaBigDecimal(2, valorTotalFrete).toString()));
					vendaBeanIterator.setDataFinal(vendaBean.getDataFinal() != null ? vendaBean.getDataFinal() : new Date(Long.MAX_VALUE));
					vendaBeanIterator.setDataInicial(vendaBean.getDataInicial() != null ? vendaBean.getDataInicial() : new Date(Long.MAX_VALUE));
					vendaBeanIterator.setQuantidadeVolumeGeral(quantidadeTotalVolumeGeral);
					vendaBean.setQuantidadeVolumeGeral(quantidadeTotalVolumeGeral);
					vendaBeanIterator.setValorFreteGeral(Double.parseDouble(Conversor.converteDoubleParaBigDecimal(2, valorTotalFreteGeral).toString()));
					vendaBean.setValorFreteGeral(Double.parseDouble(Conversor.converteDoubleParaBigDecimal(2, valorTotalFreteGeral).toString()));
					novaLista.add(vendaBeanIterator);
					quantidadeTotalVolume = 0;
					valorTotalFrete = 0;
				}
				
				listaVolumesPorTransportadora.clear();
				listaVolumesPorTransportadora.addAll(novaLista);
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	
	public void inserirDocumentoImpressoWeb(final List<VendaBean> listaVendaBeans) throws InserirObjetoException, ConsultarObjetoException
	{
		VendaModel vendaModel = null;
		try
		{
			if (listaVendaBeans.size() > 0)
			{
				vendaModel = new VendaModel(getConexao());
				synchronized (VendaBean.class)
				{
					for(VendaBean vendaBean : listaVendaBeans)
					{
						consultarDocumentoImpressoWeb(vendaBean);
						if (!vendaBean.getFlgExiste().equals("E"))
							vendaModel.inserirDocumentoImpressoWeb(vendaBean);
					}
					commit();
				}
			}
		}
		catch(InserirObjetoException e)
		{
			rollback();
			throw e;
		}
		catch (ConsultarObjetoException e)
		{
			throw e;
		}
		finally
		{
			if (vendaModel != null)
				vendaModel = null;
		}
	}
	
	private void consultarDocumentoImpressoWeb(final VendaBean vendaBean) throws ConsultarObjetoException
	{
		VendaModel vendaModel = null;
		try
		{
			if (vendaBean != null)
			{
				vendaModel = new VendaModel(getConexao());
				vendaModel.consultarDocumentoImpressoWeb(vendaBean);
			}
		}
		catch(ConsultarObjetoException e)
		{
			throw e;
		}
		finally
		{
			if (vendaModel != null)
				vendaModel = null;
		}
	}
	
	public void carregarTransportadoras(final List<VendaBean> listaTransportadora, final VendaBean vendaBean) throws ListarObjetoException, ListaVaziaException
	{
		VendaModel vendaModel = null;
		try
		{
			if (vendaBean != null)
			{	
				vendaModel = new VendaModel(getConexao());
				
				if (listaTransportadora != null && !listaTransportadora.isEmpty())
					listaTransportadora.clear();
				
				listaTransportadora.addAll(vendaModel.getListaClientesPorTransportadoras(vendaBean));
				carregarListaClientesPorTransportadora(listaTransportadora, vendaBean);
			}
		}
		catch(ListarObjetoException e)
		{
			throw e;
		}
		finally
		{
			if (vendaModel != null)
				vendaModel = null;
		}
	}
}
